一、题目原型:
将字符串 “PAYPALISHIRING” 以Z字形排列成给定的行数:
输入: s = “PAYPALISHIRING”, numRows = 3
输出: “PAHNAPLSIIGYIR”
输入: s = “PAYPALISHIRING”, numRows = 4
输出: “PINALSIGYAHRPI”
实现一个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
二、题目意思剖析:
1 | numRows = 3 |
三、解题思路:
3.1. 将原字符串按照“z字转换规律”保存进一个二维数组
3.2.将该二维数组横竖对调,得到最后的二维数组
3.3.用字符串拼接得到最后的答案
核心思路:找规律,找关键的几个数据和numRows、字符串总长度之间的关系。
下图中方框内表示一个单元格。
第一步:能够看出,这个排列是由一个个单元格(相同的排列)组成。
1 | P I N |
第二步:算出每一个单元所包含的字符个数
很简单可以看出,每个单元是由最长的那一列+中间的那几个字符。
而中间那些字符,刚好是除去最上面和最下面的那些。
所以:
1 | let letterCount = numRows + (numRows - 2) |
第三步:每个单元格包含的列数
1表示是行数最大那一列,(numRows - 2)是中间过渡的那几列1
let cols: Int = 1 + (numRows - 2)
第四步:总共有多少个单元格
1 | var count: Int = 0 |
第五步:总共列数
1 | // 最终列数 |
1 | // 1.前二维数组 |
这里需要一个创建二维数组的函数1
2
3
4// 创建二维数组
func dim<T>(_ count: Int, _ value: T) -> [T] {
return [T](repeating: value, count: count)
}
第六步:横竖置换
1 | [["a", "b", "c", "d"], |
1 | // 将数组横转,横 -> 竖 |
第七步:拼接最终字符串
1 | var result: String = "" |
四、小结
耗时1768
毫秒,超过3.85%
的提交记录,总提交数1158
。
思路完全正确的,就是耗时太长了,
有其他好的方法请极速留言,非常乐意一起探讨。😄